#!/bin/bash

# 配置文件路径（五类用户）
declare -A USER_DATA_FILES=(
    ["user"]="/volume2/nfs/git/giteebanban1000/docker/dsm/user.txt"
    ["oauser"]="/volume2/nfs/git/giteebanban1000/docker/oa/oauser.txt"
    ["dsmuser"]="/volume2/nfs/git/giteebanban1000/docker/dsm/dsmuser.txt"
    ["fnosuser"]="/volume2/nfs/git/giteebanban1000/docker/fnos/fnosuser.txt"
    ["linuxuser"]="/volume2/nfs/git/giteebanban1000/docker/linux/linuxuser.txt"
)

declare -A PASSWORD_FILES=(
    ["user"]="/volume2/nfs/userpassword.txt"
    ["oauser"]="/volume2/nfs/oauserpassword.txt"
    ["dsmuser"]="/volume2/nfs/dsmuserpassword.txt"
    ["fnosuser"]="/volume2/nfs/fnosuserpassword.txt"
    ["linuxuser"]="/volume2/nfs/linuxuserpassword.txt"
)

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 创建目录（如果不存在）
create_directory() {
    local file="$1"
    local dir=$(dirname "$file")
    
    if [[ ! -d "$dir" ]]; then
        echo -e "${YELLOW}创建目录: $dir${NC}"
        mkdir -p "$dir"
        if [[ $? -ne 0 ]]; then
            echo -e "${RED}错误: 无法创建目录 $dir${NC}" >&2
            return 1
        fi
    fi
    return 0
}

# 初始化所有文件
init_files() {
    for type in "${!USER_DATA_FILES[@]}"; do
        file="${USER_DATA_FILES[$type]}"
        if ! create_directory "$file"; then
            exit 1
        fi
        
        if [[ ! -f "$file" ]]; then
            if touch "$file"; then
                chmod 600 "$file"
                chown $(whoami) "$file"
                echo -e "${GREEN}创建文件: $file${NC}"
            else
                echo -e "${RED}错误: 无法创建文件 $file${NC}" >&2
                exit 1
            fi
        else
            chmod 600 "$file"
            chown $(whoami) "$file"
        fi
    done
    
    for type in "${!PASSWORD_FILES[@]}"; do
        file="${PASSWORD_FILES[$type]}"
        if ! create_directory "$file"; then
            exit 1
        fi
        
        if [[ ! -f "$file" ]]; then
            if touch "$file"; then
                chmod 600 "$file"
                chown $(whoami) "$file"
                echo -e "${GREEN}创建文件: $file${NC}"
            else
                echo -e "${RED}错误: 无法创建文件 $file${NC}" >&2
                exit 1
            fi
        else
            chmod 600 "$file"
            chown $(whoami) "$file"
        fi
    done
}

# 选择用户类型
select_user_type() {
    PS3="请选择用户类型 (1-5): "
    select type in "普通用户(user)" "OA用户(oauser)" "DSM用户(dsmuser)" "FNOS用户(fnosuser)" "Linux用户(linuxuser)"; do
        case $type in
            "普通用户(user)") echo "user"; break ;;
            "OA用户(oauser)") echo "oauser"; break ;;
            "DSM用户(dsmuser)") echo "dsmuser"; break ;;
            "FNOS用户(fnosuser)") echo "fnosuser"; break ;;
            "Linux用户(linuxuser)") echo "linuxuser"; break ;;
            *) echo -e "${RED}无效选择，请重新输入!${NC}" ;;
        esac
    done
}

# 生成随机用户名(6位字母数字)
generate_username() {
    cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 6 | head -n 1 | tr '[:upper:]' '[:lower:]'
}

# 生成随机密码(8位字母数字+特殊字符)
generate_password() {
    # 定义特殊字符集
    local special_chars="!@#￥%&"
    
    # 生成7位字母数字
    local base_password=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 7 | head -n 1)
    
    # 随机选择一个特殊字符
    local special_char=$(echo "$special_chars" | fold -w1 | shuf | head -n1)
    
    # 随机插入位置 (0-7，表示在base_password的字符之间)
    local insert_position=$((RANDOM % 8))
    
    # 构建最终密码
    if [[ $insert_position -eq 0 ]]; then
        echo "${special_char}${base_password}"
    elif [[ $insert_position -eq 7 ]]; then
        echo "${base_password}${special_char}"
    else
        local first_part="${base_password:0:$insert_position}"
        local second_part="${base_password:$insert_position}"
        echo "${first_part}${special_char}${second_part}"
    fi
}

# 获取当前日期
get_current_date() {
    date +%Y-%m-%d
}

# 检查用户名是否存在
check_username_exists() {
    local type=$1
    local username=$2
    local user_file="${USER_DATA_FILES[$type]}"
    
    # 如果文件不存在，先创建
    if [[ ! -f "$user_file" ]]; then
        if ! create_directory "$user_file" || ! touch "$user_file"; then
            echo -e "${RED}错误: 无法访问用户文件 $user_file${NC}" >&2
            return 1
        fi
    fi
    
    grep -q "^\[\"$username\"\]" "$user_file"
}

# 安全文件操作函数
safe_file_operation() {
    local operation=$1
    local file=$2
    local tmp_file="${file}.tmp"
    
    # 确保文件存在
    if [[ ! -f "$file" ]]; then
        if ! create_directory "$file" || ! touch "$file"; then
            echo -e "${RED}错误: 无法访问文件 $file${NC}" >&2
            return 1
        fi
    fi
    
    # 执行操作
    if eval "$operation \"$file\" \"$tmp_file\""; then
        if mv "$tmp_file" "$file"; then
            # 删除临时文件（如果存在）
            [[ -f "$tmp_file" ]] && rm -f "$tmp_file"
            return 0
        else
            echo -e "${RED}错误: 无法移动临时文件${NC}" >&2
            return 1
        fi
    else
        echo -e "${RED}错误: 文件操作失败${NC}" >&2
        # 删除临时文件（如果存在）
        [[ -f "$tmp_file" ]] && rm -f "$tmp_file"
        return 1
    fi
}

# 提取备注信息（仅用于密码文件）
extract_remarks() {
    local line="$1"
    local remarks=""
    
    if [[ "$line" =~ bl=\"([^\"]*)\" ]]; then
        remarks="bl=\"${BASH_REMATCH[1]}\""
    fi
    
    if [[ "$line" =~ \#(.*)$ ]]; then
        local comment="${BASH_REMATCH[1]}"
        comment=$(echo "$comment" | sed 's/密码最后修改于 [0-9-]\+//g' | sed 's/bl="[^"]*"//g' | xargs)
        [[ -n "$comment" ]] && remarks="$remarks # $comment"
    fi
    
    echo "$remarks" | sed 's/^ *//;s/ *$//'
}

# 更新明文密码文件（增加有效期信息）
update_password_file() {
    local type=$1
    local username="$2"
    local password="$3"
    local current_date="$4"
    local remarks="$5"
    local validity_months="${6:-12}"  # 默认12个月
    
    local password_file="${PASSWORD_FILES[$type]}"
    
    # 确保密码文件存在
    if [[ ! -f "$password_file" ]]; then
        if ! create_directory "$password_file" || ! touch "$password_file"; then
            echo -e "${RED}错误: 无法访问密码文件 $password_file${NC}" >&2
            return 1
        fi
    fi
    
    remarks=$(echo "$remarks" | sed 's/##*/#/g' | sed 's/^# //' | sed 's/ $//')
    
    # 构建有效期显示文本
    local validity_display=""
    if [[ "$validity_months" -eq 0 ]]; then
        validity_display="长期有效"
    else
        validity_display="有效期: ${validity_months}个月"
    fi
    
    local entry="$username $password | 修改日期: $current_date | $validity_display"
    [[ -n "$remarks" ]] && entry="$entry $remarks"
    
    if grep -q "^$username " "$password_file"; then
        # 使用sed来更新密码文件，避免awk的复杂引号问题
        local tmp_file="${password_file}.tmp"
        if sed "/^$username /c\\$entry" "$password_file" > "$tmp_file" 2>/dev/null; then
            if mv "$tmp_file" "$password_file"; then
                [[ -f "$tmp_file" ]] && rm -f "$tmp_file"
                return 0
            else
                echo -e "${RED}错误: 无法更新密码文件${NC}" >&2
                [[ -f "$tmp_file" ]] && rm -f "$tmp_file"
                return 1
            fi
        else
            echo -e "${RED}错误: 无法更新密码文件${NC}" >&2
            [[ -f "$tmp_file" ]] && rm -f "$tmp_file"
            return 1
        fi
    else
        echo "$entry" >> "$password_file"
        return 0
    fi
}

# 添加单个用户
add_single_user() {
    local type=$(select_user_type)
    local user_file="${USER_DATA_FILES[$type]}"
    local current_date=$(get_current_date)
    local validity_months=12

    # 确保用户文件存在
    if [[ ! -f "$user_file" ]]; then
        if ! create_directory "$user_file" || ! touch "$user_file"; then
            echo -e "${RED}错误: 无法访问用户文件 $user_file${NC}"
            return 1
        fi
    fi

    read -p "是否自定义用户名？(y/n, 默认n): " custom_username
    case "${custom_username,,}" in
        "y"|"yes")
            while true; do
                read -p "请输入用户名: " username
                if ! check_username_exists "$type" "$username"; then
                    break
                fi
                echo -e "${RED}错误: 用户名已存在!${NC}"
            done
            ;;
        *)
            username=$(generate_username)
            while check_username_exists "$type" "$username"; do
                username=$(generate_username)
            done
            ;;
    esac

    read -p "是否自定义密码？(y/n, 默认n): " custom_password
    case "${custom_password,,}" in
        "y"|"yes")
            while true; do
                read -s -p "请输入密码: " password
                echo
                [[ -n "$password" ]] && break
                echo -e "${RED}密码不能为空!${NC}"
            done
            ;;
        *)
            password=$(generate_password)
            ;;
    esac

    local hashed_password=$(echo -n "$password" | sha256sum | awk '{print $1}')
    local department=("财务" "技术" "行政" "市场" "人事")
    local dept_index=$((RANDOM % ${#department[@]}))
    local bl_remark="bl=\"部门:${department[$dept_index]}\""
    
    # 无注释的条目格式
    local encrypted_entry="[\"$username\"]=\"$hashed_password|$current_date|$validity_months\""
    echo "$encrypted_entry" >> "$user_file"
    
    # 密码文件保留完整注释（包含有效期信息）
    if update_password_file "$type" "$username" "$password" "$current_date" "$bl_remark" "$validity_months"; then
        echo -e "${GREEN}用户添加成功!${NC}"
        echo "用户名: $username"
        [[ "${custom_password,,}" != "y" ]] && echo "自动生成密码: $password"
        echo "有效期: $validity_months 个月"
    else
        echo -e "${RED}错误: 用户添加失败${NC}"
        # 回滚：从用户文件中删除刚添加的用户
        sed -i "/^\[\"$username\"\]/d" "$user_file"
        return 1
    fi
}

# 批量生成用户
batch_generate_users() {
    local type=$(select_user_type)
    local user_file="${USER_DATA_FILES[$type]}"
    local current_date=$(get_current_date)
    local validity_months=12

    read -p "请输入要生成的用户数量: " count
    if ! [[ "$count" =~ ^[1-9][0-9]*$ ]]; then
        echo -e "${RED}错误: 请输入有效的数字!${NC}"
        return 1
    fi

    echo -e "${YELLOW}开始生成 $count 个用户...${NC}"
    
    for ((i=1; i<=count; i++)); do
        username=$(generate_username)
        while check_username_exists "$type" "$username"; do
            username=$(generate_username)
        done
        
        password=$(generate_password)
        hashed_password=$(echo -n "$password" | sha256sum | awk '{print $1}')
        
        local department=("财务" "技术" "行政" "市场" "人事")
        local dept_index=$((RANDOM % ${#department[@]}))
        local bl_remark="bl=\"部门:${department[$dept_index]}\""
        
        # 用户文件
        echo "[\"$username\"]=\"$hashed_password|$current_date|$validity_months\"" >> "$user_file"
        
        # 密码文件
        update_password_file "$type" "$username" "$password" "$current_date" "$bl_remark" "$validity_months"
        
        echo -e "${GREEN}用户 $i/$count 生成成功: $username / $password${NC}"
    done
    
    echo -e "${GREEN}批量生成完成! 共生成 $count 个用户${NC}"
}

# 修改用户密码（不更新日期）
modify_user_password() {
    local type=$(select_user_type)
    local user_file="${USER_DATA_FILES[$type]}"
    list_users "$type"
    read -p "请输入要修改密码的用户名: " username
    
    if ! check_username_exists "$type" "$username"; then
        echo -e "${RED}错误: 用户不存在!${NC}"
        return 1
    fi
    
    # 获取当前用户信息（保持原日期）
    local old_user_line=$(grep "^\[\"$username\"\]" "$user_file")
    local old_hashed_password=$(echo "$old_user_line" | awk -F'"' '{print $4}' | cut -d'|' -f1)
    local old_date=$(echo "$old_user_line" | awk -F'"' '{print $4}' | cut -d'|' -f2)
    local old_validity=$(echo "$old_user_line" | awk -F'"' '{print $4}' | cut -d'|' -f3)
    
    read -p "是否自定义新密码？(y/n, 默认n): " custom_password
    case "${custom_password,,}" in
        "y"|"yes")
            while true; do
                read -s -p "请输入新密码: " new_password
                echo
                [[ -n "$new_password" ]] && break
                echo -e "${RED}密码不能为空!${NC}"
            done
            ;;
        *)
            new_password=$(generate_password)
            ;;
    esac
    
    local new_hashed_password=$(echo -n "$new_password" | sha256sum | awk '{print $1}')
    
    # 更新用户文件（保持原日期）
    local new_entry="[\"$username\"]=\"$new_hashed_password|$old_date|$old_validity\""
    sed -i "s/^\[\"$username\"\].*/$new_entry/" "$user_file"
    
    # 更新密码文件（保持原日期）
    local password_file="${PASSWORD_FILES[$type]}"
    local old_password_line=$(grep "^$username " "$password_file")
    local remarks=$(extract_remarks "$old_password_line")
    
    # 使用原日期而不是当前日期
    if update_password_file "$type" "$username" "$new_password" "$old_date" "$remarks" "$old_validity"; then
        echo -e "${GREEN}密码修改成功!${NC}"
        echo "用户名: $username"
        [[ "${custom_password,,}" != "y" ]] && echo "自动生成新密码: $new_password"
        echo "修改日期保持不变: $old_date"
    else
        echo -e "${RED}错误: 密码修改失败${NC}"
        # 回滚用户文件
        echo "$old_user_line" >> "$user_file"
        sed -i "/^\[\"$username\"\]/d" "$user_file"
        echo "$old_user_line" >> "$user_file"
        return 1
    fi
}

# 修改bl备注（更新日期）
modify_bl_remark() {
    local type=$(select_user_type)
    local user_file="${USER_DATA_FILES[$type]}"
    list_users "$type"
    read -p "请输入要修改备注的用户名: " username
    
    if ! check_username_exists "$type" "$username"; then
        echo -e "${RED}错误: 用户不存在!${NC}"
        return 1
    fi
    
    # 从密码文件中获取当前备注
    local password_file="${PASSWORD_FILES[$type]}"
    local current_bl=""
    local old_password_line=$(grep "^$username " "$password_file" 2>/dev/null)
    
    if [[ "$old_password_line" =~ bl=\"([^\"]*)\" ]]; then
        current_bl="${BASH_REMATCH[1]}"
    fi
    
    echo "----------------------------------------"
    echo "当前用户信息:"
    echo "用户名: $username"
    if [[ -n "$current_bl" ]]; then
        echo "当前备注: $current_bl"
    else
        echo "当前备注: 无"
    fi
    echo "----------------------------------------"
    
    while true; do
        read -p "请输入新的bl备注内容(必填): " new_bl_remark
        if [[ -n "$new_bl_remark" ]]; then
            break
        else
            echo -e "${RED}错误: 备注内容不能为空，请重新输入!${NC}"
        fi
    done
    
    local current_date=$(get_current_date)
    
    # 获取当前用户信息（保持原密码和有效期）
    local old_user_line=$(grep "^\[\"$username\"\]" "$user_file")
    local old_hashed_password=$(echo "$old_user_line" | awk -F'"' '{print $4}' | cut -d'|' -f1)
    local old_validity=$(echo "$old_user_line" | awk -F'"' '{print $4}' | cut -d'|' -f3)
    local old_password=$(echo "$old_password_line" | awk '{print $2}')
    
    # 处理其他备注信息（来自密码文件）
    local other_remarks=""
    if [[ "$old_password_line" =~ \#(.*)$ ]]; then
        other_remarks="${BASH_REMATCH[1]}"
        other_remarks=$(echo "$other_remarks" | sed 's/bl="[^"]*"//g' | sed 's/密码最后修改于 [0-9-]\+//g' | xargs)
    fi
    
    # 构建新备注（仅用于密码文件）
    local remarks="bl=\"$new_bl_remark\""
    [[ -n "$other_remarks" ]] && remarks="$remarks # $other_remarks"
    
    # 用户文件条目（更新日期）
    local new_entry="[\"$username\"]=\"$old_hashed_password|$current_date|$old_validity\""
    
    # 使用sed来更新用户文件
    local tmp_file="${user_file}.tmp"
    if sed "/^\[\"$username\"\]/c\\$new_entry" "$user_file" > "$tmp_file" 2>/dev/null; then
        if mv "$tmp_file" "$user_file"; then
            [[ -f "$tmp_file" ]] && rm -f "$tmp_file"
            
            # 更新密码文件（使用当前日期）
            if update_password_file "$type" "$username" "$old_password" "$current_date" "$remarks" "$old_validity"; then
                echo "----------------------------------------"
                echo -e "${GREEN}用户备注修改成功!${NC}"
                echo "用户名: $username"
                echo "新备注: $new_bl_remark"
                [[ -n "$other_remarks" ]] && echo "保留的其他备注: $other_remarks"
                echo "修改日期已更新为: $current_date"
                echo "有效期: $old_validity 个月"
                echo "----------------------------------------"
            else
                echo -e "${RED}错误: 密码文件更新失败${NC}"
                # 回滚用户文件
                echo "$old_user_line" >> "$user_file"
                sed -i "/^\[\"$username\"\]/d" "$user_file"
                echo "$old_user_line" >> "$user_file"
                return 1
            fi
        else
            echo -e "${RED}错误: 无法更新用户文件${NC}"
            [[ -f "$tmp_file" ]] && rm -f "$tmp_file"
            return 1
        fi
    else
        echo -e "${RED}错误: 无法更新用户文件${NC}"
        [[ -f "$tmp_file" ]] && rm -f "$tmp_file"
        return 1
    fi
}

# 修改密码有效期（更新日期）
modify_validity_period() {
    local type=$(select_user_type)
    local user_file="${USER_DATA_FILES[$type]}"
    list_users "$type"
    read -p "请输入要修改有效期的用户名: " username
    
    if ! check_username_exists "$type" "$username"; then
        echo -e "${RED}错误: 用户不存在!${NC}"
        return 1
    fi
    
    # 获取当前用户信息
    local old_user_line=$(grep "^\[\"$username\"\]" "$user_file")
    local old_hashed_password=$(echo "$old_user_line" | awk -F'"' '{print $4}' | cut -d'|' -f1)
    local old_date=$(echo "$old_user_line" | awk -F'"' '{print $4}' | cut -d'|' -f2)
    local old_validity=$(echo "$old_user_line" | awk -F'"' '{print $4}' | cut -d'|' -f3)
    
    echo "当前有效期: $old_validity 个月"
    read -p "请输入新的有效期（月数，0表示长期有效）: " new_validity
    
    if ! [[ "$new_validity" =~ ^[0-9]+$ ]]; then
        echo -e "${RED}错误: 请输入有效的数字!${NC}"
        return 1
    fi
    
    local current_date=$(get_current_date)
    
    # 更新用户文件（更新日期）
    local new_entry="[\"$username\"]=\"$old_hashed_password|$current_date|$new_validity\""
    sed -i "s/^\[\"$username\"\].*/$new_entry/" "$user_file"
    
    # 更新密码文件
    local password_file="${PASSWORD_FILES[$type]}"
    local old_password_line=$(grep "^$username " "$password_file")
    local password=$(echo "$old_password_line" | awk '{print $2}')
    local remarks=$(extract_remarks "$old_password_line")
    
    if update_password_file "$type" "$username" "$password" "$current_date" "$remarks" "$new_validity"; then
        echo -e "${GREEN}有效期修改成功!${NC}"
        echo "用户名: $username"
        if [[ "$new_validity" -eq 0 ]]; then
            echo "新有效期: 长期有效"
        else
            echo "新有效期: $new_validity 个月"
        fi
        echo "修改日期已更新为: $current_date"
    else
        echo -e "${RED}错误: 有效期修改失败${NC}"
        # 回滚用户文件
        echo "$old_user_line" >> "$user_file"
        sed -i "/^\[\"$username\"\]/d" "$user_file"
        echo "$old_user_line" >> "$user_file"
        return 1
    fi
}

# 删除用户
delete_user() {
    local type=$(select_user_type)
    local user_file="${USER_DATA_FILES[$type]}"
    list_users "$type"
    read -p "请输入要删除的用户名: " username
    
    if ! check_username_exists "$type" "$username"; then
        echo -e "${RED}错误: 用户不存在!${NC}"
        return 1
    fi
    
    read -p "确认删除用户 $username？(y/n): " confirm
    if [[ "${confirm,,}" != "y" && "${confirm,,}" != "yes" ]]; then
        echo "操作已取消"
        return 0
    fi
    
    # 备份用户信息（用于可能的恢复）
    local old_user_line=$(grep "^\[\"$username\"\]" "$user_file")
    
    # 从用户文件中删除
    sed -i "/^\[\"$username\"\]/d" "$user_file"
    
    # 从密码文件中删除
    local password_file="${PASSWORD_FILES[$type]}"
    if [[ -f "$password_file" ]]; then
        sed -i "/^$username /d" "$password_file"
    fi
    
    echo -e "${GREEN}用户 $username 已成功删除!${NC}"
    
    # 询问是否备份被删除的用户信息
    read -p "是否备份被删除的用户信息？(y/n): " backup
    if [[ "${backup,,}" == "y" || "${backup,,}" == "yes" ]]; then
        local backup_file="/tmp/deleted_users_backup.txt"
        echo "Deleted user: $old_user_line" >> "$backup_file"
        echo "备份已保存到: $backup_file"
    fi
}

# 显示用户列表
list_users() {
    local type=$1
    local user_file="${USER_DATA_FILES[$type]}"
    
    # 确保文件存在
    if [[ ! -f "$user_file" ]]; then
        if ! create_directory "$user_file" || ! touch "$user_file"; then
            echo -e "${RED}错误: 无法访问用户文件 $user_file${NC}"
            return 1
        fi
    fi
    
    echo "当前${type}用户列表:"
    echo "----------------------------------------"
    local count=0
    while read -r line; do
        if [[ "$line" =~ ^\[\"([^\"]+)\"\] ]]; then
            printf "%-10s" "${BASH_REMATCH[1]}"
            ((count++))
            [[ $((count % 5)) -eq 0 ]] && echo
        fi
    done < "$user_file"
    [[ $((count % 5)) -ne 0 ]] && echo
    echo "----------------------------------------"
    echo "总计${type}用户数: $count"
}

# 主菜单
main_menu() {
    init_files
    
    while true; do
        echo "========================================"
        echo -e "${BLUE}多类型用户管理系统${NC}"
        echo "1. 添加单个用户"
        echo "2. 批量生成用户"
        echo "3. 修改用户密码（日期不更新）"
        echo "4. 修改bl备注（日期更新）"
        echo "5. 修改密码有效期（日期更新）"
        echo "6. 删除用户"
        echo "7. 查看用户列表"
        echo "0. 退出系统"
        read -p "请输入选择 (0-7): " choice

        case $choice in
            1) add_single_user ;;
            2) batch_generate_users ;;
            3) modify_user_password ;;
            4) modify_bl_remark ;;
            5) modify_validity_period ;;
            6) delete_user ;;
            7) 
                local type=$(select_user_type)
                list_users "$type" 
                ;;
            0) echo "系统已退出"; exit 0 ;;
            *) echo -e "${RED}无效输入，请重新选择!${NC}" ;;
        esac
        echo
    done
}

# 启动脚本
main_menu